package com.cwvs.helper;

import java.io.File;
import java.io.IOException;

import javax.annotation.Resource;

import org.im4java.core.ConvertCmd;
import org.im4java.core.IM4JavaException;
import org.im4java.core.IMOperation;
import org.im4java.process.StandardStream;
import org.springframework.stereotype.Component;

/**
 * 图片处理Component
 */
@Component
public class ImageHandleHelper {

    @Resource
    private FileRootHelper fileRootHelper;

    public ImageHandleHelper() {
        System.setProperty("jmagick.systemclassloader", "no");
    }

    private Boolean checkStringIsNotEmpty(String str) {
        Boolean flag = false;
        if (null != str && str.length() > 0) {
            flag = true;
        }
        return flag;
    }

    /**
     * 用于生成缩略图的实际方法
     * 
     * @param dir 生成的文件要保存的路径
     * @param fileName 源文件名称,不包含绝对位置和后缀
     * @param fileAbsolutePath 源文件 全名,包含绝对位置和文件后缀
     * @param type 保存的文件类型,如大图用"b"表示
     * @param width 生成的新图片的宽度
     * @param height 生成的新图片的高度
     * @throws Exception
     */
    private void genrateThumbnail(File dir, String fileName, String fileAbsolutePath, String type, int width, int height)
                                                                                                                         throws Exception {
        if (null != dir && checkStringIsNotEmpty(fileName) && checkStringIsNotEmpty(fileAbsolutePath)
            && checkStringIsNotEmpty(type) && width > 0 && height > 0) {
            if (dir.isDirectory() && !dir.exists()) {
                dir.mkdirs();
            }
            if (new File(fileAbsolutePath).exists()) {
                String target = new File(dir, fileName + "-" + type + ".png").getAbsolutePath();
                //图片生成
                drawImg(fileAbsolutePath,target,width,height,false,true);
            }
        }
    }

    /**
     * 用于生成头像缩略图的实际方法
     * 
     * @param dir 生成的文件要保存的路径
     * @param fileName 源文件名称,不包含绝对位置和后缀
     * @param fileAbsolutePath 源文件 全名,包含绝对位置和文件后缀
     * @param type 保存的文件类型,如大图用"b"表示
     * @param width 生成的新图片的宽度
     * @param height 生成的新图片的高度
     * @throws Exception
     */
    public String headImageThumbnail(File dir, String fileName, String fileAbsolutePath, String objectId, int width,
                                     int height,boolean iswater,boolean cut) throws Exception {
        if (null != dir && checkStringIsNotEmpty(fileName) && checkStringIsNotEmpty(fileAbsolutePath) && width > 0
            && height > 0) {
            if (dir.isDirectory() && !dir.exists()) {
                dir.mkdirs();
            }

            if (new File(fileAbsolutePath).exists()) {
                String target = new File(dir, objectId + ".gif").getAbsolutePath();
                drawImg(fileAbsolutePath,target,width,height,iswater,cut);
                return target.replace("\\", "/");
            }
        }
        return "";
    }
    /**
     * 生成压缩图
     * 
     * @param dir
     * @param fileName
     * @param fileAbsolutePath
     * @throws Exception
     */
    public void genrateThumbnail(File dir, String fileName, String fileAbsolutePath) throws Exception {
        String[] types = { "b", "m", "s" };
        int[] widths = { 500, 300, 100 };
        int[] heights = { 500, 300, 100 };
        for (int i = 0; i < widths.length; i++) {
            genrateThumbnail(dir, fileName, fileAbsolutePath, types[i], widths[i], heights[i]);
        }
    }
    /**
     * 生成压缩图
     * 
     * @param dir
     * @param fileName
     * @param fileAbsolutePath
     * @throws Exception
     */
    public void genrateThumbnail(File dir, String fileName, String fileAbsolutePath, Boolean addWaterMark,boolean cut)
                                                                                                          throws Exception {
        String[] types = { "b", "m", "s" };
        int[] widths = { 500, 300, 100 };
        int[] heights = { 500, 300, 100 };
        for (int i = 0; i < widths.length; i++) {
            genrateThumbnail(dir, fileName, fileAbsolutePath, types[i], widths[i], heights[i], addWaterMark,cut);
        }
    }

    /**
     * 用于生成缩略图的实际方法
     * 
     * @param dir 生成的文件要保存的路径
     * @param fileName 源文件名称,不包含绝对位置和后缀
     * @param fileAbsolutePath 源文件 全名,包含绝对位置和文件后缀
     * @param type 保存的文件类型,如大图用"b"表示
     * @param width 生成的新图片的宽度
     * @param height 生成的新图片的高度
     * @throws Exception
     */
    private void genrateThumbnail(File dir, String fileName, String fileAbsolutePath, String type, int width,
                                  int height, Boolean addWaterMark,boolean cut) throws Exception {
        if (null != dir && checkStringIsNotEmpty(fileName) && checkStringIsNotEmpty(fileAbsolutePath)
            && checkStringIsNotEmpty(type) && width > 0 && height > 0) {
            if (dir.isDirectory() && !dir.exists()) {
                dir.mkdirs();
            }
            // 默认添加水印
            if (null == addWaterMark) {
                addWaterMark = true;
            }
            if (new File(fileAbsolutePath).exists()) {
                String target = new File(dir, fileName + "-" + type + ".gif").getAbsolutePath();
                drawImg(fileAbsolutePath,target,width,height,addWaterMark,cut);
            }
        }
    }
    
    
    
    /** 
     *  
     * @param picPath 图片路径 
     * @param drawPicPath draw后的路径 
     * @param width draw后的宽度 
     * @param height draw后的高度 
     * @param water 是否水印
     * @param cut 是否对图片进行裁剪
     * @throws IOException 
     * @throws InterruptedException 
     * @throws IM4JavaException 
     */  
    private void drawImg(String picPath,String drawPicPath,int width, int height,boolean water,boolean cut) throws IOException, InterruptedException, IM4JavaException{  
        IMOperation op = new IMOperation();  
        op.addImage();  
        if(cut){
        	op.resize(width, height,'^').gravity("center").extent(width, height);
        }else{
        	op.resize(width, height);
        }
        
//        op.font("Arial").fill("red").draw("text 100,100 www.taobao.com"); 
        //显示
        op.quality(100.0);  
        op.addImage();
        //水印图片位置
        //String logoPath = handleString(fileRootHelper.getImageFileRoot()) + "static/shuiyin.png";
        //IM4JAVA是同时支持ImageMagick和GraphicsMagick的，如果为true则使用GM，如果为false支持IM。  
        ConvertCmd cmd = new ConvertCmd(true);  
        String osName = System.getProperty("os.name").toLowerCase();      
        if(osName.indexOf("win")>=0) {  //linux下不要设置此值，不然会报错  
            cmd.setSearchPath(fileRootHelper.getGraphicsMagickPath());   
           }  
        cmd.setErrorConsumer(StandardStream.STDERR);  
        cmd.run(op, picPath , drawPicPath);  
    } 
    
    
}
